/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.bld.model.municipio;

import br.com.bld.util.facade.AbstractBe;
import br.com.bld.util.facade.BLDDataErro;
import br.com.bld.util.facade.EntityFactory;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Pedro
 */
public class MunicipioBe extends AbstractBe implements BLDDataErro {

    private final MunicipioDao dao;

    public MunicipioBe() throws SQLException {
        super();
        dao = createDao();
    }

    public MunicipioBe(Connection conn) throws SQLException {
        super(conn);

        dao = createDao();
    }

    private MunicipioDao createDao() {

        String table = "bldtb03_municipio";

        String[] fields = {
            "codg_ibge",
            "nome",
            "uf"
        };

        String[] pk = {"codg_ibge"};

        return new MunicipioDao(conn, new EntityFactory(conn, table, fields, pk));
    }

    public int inserir(MunicipioEntity entity, Long codgIbge) throws SQLException {

        if (entity == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, MunicipioEntity.CLASS_ID));
        }

        if (codgIbge == null || codgIbge < 0) {
            throw new IllegalArgumentException(VALOR_NAO_PERMITIDO);
        }

        if (entity.getNome().equals("")) {
            throw new IllegalArgumentException(String.format(CAMPO_OBRIGATORIO, MunicipioEntity.CAMPO_NOME));
        }

        if (entity.getUf().equals("")) {
            throw new IllegalArgumentException(String.format(CAMPO_OBRIGATORIO, MunicipioEntity.CAMPO_UF));
        }

        int resposta = dao.insert(entity, new MunicipioPK(codgIbge));

        commit();

        return resposta;
    }

    public MunicipioEntity selecionar(MunicipioPK pk) throws SQLException {

        if (pk == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, MunicipioPK.CLASS_ID));
        }

        return dao.selectByPk(pk);
    }

    public int atualizar(MunicipioEntity entity, MunicipioPK pk) throws SQLException {

        if (entity == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, MunicipioEntity.CLASS_ID));
        }

        if (selecionar(pk) == null) {
            throw new IllegalArgumentException(REGT_NAO_LOCALIZADO);
        }

        int resposta = dao.update(entity, pk);

        commit();

        return resposta;
    }

    public int apagar(MunicipioPK pk) throws SQLException {

        if (pk == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, MunicipioPK.CLASS_ID));
        }

        if (selecionar(pk) == null) {
            throw new IllegalArgumentException(REGT_NAO_LOCALIZADO);
        }

        int resposta = dao.delete(pk);

        commit();

        return resposta;
    }

    public HashMap<MunicipioPK, MunicipioEntity> selecionarTodos() throws SQLException {
        return dao.selectAll();
    }

    public HashMap<MunicipioPK, MunicipioEntity> selecionarPaginacao(Integer numrPagina, Integer qtdePorPagina) throws SQLException {

        if (numrPagina == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, "Número da Página"));
        }
        if (numrPagina == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, "Quantidade por Página"));
        }

        return dao.selectByPage(numrPagina, qtdePorPagina);
    }

    public Collection<String> selecionarUF() throws SQLException {
        return dao.selectUF();
    }
    
    public HashMap<MunicipioPK, MunicipioEntity> selecionarPorUF(String uf) throws SQLException {
        return dao.selectByUF(uf);
    }
}
